﻿using System;
using System.Net;

using System.Runtime.InteropServices;
using System.Linq;
namespace AudioTester.WaveStreams
{

    internal static class ByteCopyer
    {
        public static void CopyTo(this byte[] source, byte[] target, int targetStartIndex)
        {
            Buffer.BlockCopy(source, 0, target, targetStartIndex, source.Length);

        }
    }


    //    偏移地址 字节数 类型 内容  
    //00H~03H 4 字符 资源交换文件标志（RIFF） 
    //04H~07H 4 长整数 从下个地址开始到文件尾的总字节数 
    //08H~0BH 4 字符 WAV文件标志（WAVE） 
    //0CH~0FH 4 字符 波形格式标志（FMT） 
    //10H~13H 4 整数 过滤字节（一般为00000010H） 
    //14H~15H 2 整数 格式种类（值为1时，表示数据为线性PCM编码） 
    //16H~17H 2 整数 通道数，单声道为1，双声音为2 
    //18H~1BH 4 长整数 采样频率 
    //1CH~1FH 4 长整数 波形数据传输速率（每秒平均字节数） 
    //20H~21H 2 整数 数据的调整数（按字节计算） 
    //22H~23H 2 整数 样本数据位数 

    //24H~27H 4 字符 数据标志符（data） 
    //28H~2BH 4 长整型 采样数据总数 
    //2CH... ... ​ 采样数据 

    public partial class WaveHeader
    {
        public WaveHeader()
        {
            //this.SamplingDepth = 16;
            //this.SamplingFrequency = 44100;
            //this.Channels = 2;
            //this.TotalStreamLength = int.MaxValue;


        }


        #region 04H~07H 4 长整数 从下个地址开始到文件尾的总字节数

        /// <summary>
        /// 04H~07H 4 长整数 从下个地址开始到文件尾的总字节数 
        /// </summary>
        public Int32 TotalStreamLength
        {
            get { return BitConverter.ToInt32(_instanceHeader, 0x4); }
            set { BitConverter.GetBytes(value).CopyTo(_instanceHeader, 0x4); }
        }
        #endregion

        #region 16H~17H 2 整数 通道数，单声道为1，双声道为2

        /// <summary>
        /// 16H~17H 2 整数 通道数，单声道为1，双声道为2 
        /// </summary>
        public Int16 Channels
        {
            get { return BitConverter.ToInt16(_instanceHeader, 0x16); }
            set
            {
                BitConverter.GetBytes(value).CopyTo(_instanceHeader, 0x16);
                RefreshBytesPerSecond();
            }
        }

        #endregion

        #region 18H~1BH 4 长整数 采样频率
        /// <summary>
        /// 18H~1BH 4 长整数 采样频率
        /// </summary>
        public int SamplingFrequency
        {
            get { return BitConverter.ToInt32(_instanceHeader, 0x18); }
            set
            {
                BitConverter.GetBytes(value).CopyTo(_instanceHeader, 0x18);
                RefreshBytesPerSecond();
            }
        }

        #endregion

        #region 1CH~1FH 4 长整数 波形数据传输速率（每秒平均字节数）

        /// <summary>
        /// 1CH~1FH 4 长整数 波形数据传输速率（每秒平均字节数）
        /// </summary>
        public int BytesPerSecond
        {
            get { return BitConverter.ToInt32(_instanceHeader, 0x1c); }
            private set { BitConverter.GetBytes(value).CopyTo(_instanceHeader, 0x1c); }
        }

        #endregion

        #region 20H~21H 2 整数 数据的调整数（按字节计算）
        /// <summary>
        /// 20H~21H 2 整数 数据的调整数（按字节计算）
        /// </summary>
        public Int16 DataAlterive
        {
            get { return BitConverter.ToInt16(_instanceHeader, 0x20); }
            set { BitConverter.GetBytes(value).CopyTo(_instanceHeader, 0x20); }
        }
        #endregion

        #region 22H~23H 2 整数 样本数据位数
        /// <summary>
        /// 22H~23H 2 整数 样本数据位数 
        /// </summary>
        public Int16 SamplingDepth
        {
            get { return BitConverter.ToInt16(_instanceHeader, 0x22); }
            set
            {
                BitConverter.GetBytes(value).CopyTo(_instanceHeader, 0x22);
                RefreshBytesPerSecond();
            }
        }
        #endregion

        private void RefreshBytesPerSecond()
        {
            BytesPerSecond = SamplingDepth * SamplingFrequency * Channels / 8;
        }

        byte[] _instanceHeader = headerBufferTemplate.ToArray();

        public byte[] InstanceHeader
        {
            get { return _instanceHeader; }
            
        }




        static byte[] headerBufferTemplate = new byte[] 
        { 
            0x52,
            0x49,
            0x46,
            0x46,
            0x24,
            0xCD,
            0x01,
            0x00,
           
            0x57,
            0x41,
            0x56,
            0x45,
            0x66,
            0x6d,
            0x74,
            0x20,
           
            0x10,
            0x00,
            0x00,
            0x00,
            0x01,
            0x00,
            0x02,
            0x00,
           
            0x44,
            0xac,
            0x00,
            0x00,
            0x10,
            0xb1,
            0x02,
            0x00,
           
            0x04,
            0x00,
            0x10,
            0x00,
            0x64,
            0x61,
            0x74,
            0x61,

            0x00,
            0xcd,
            0x01,
            0x00
        };


    }
}
